#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <termios.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>

#define ERROR_CHECK(ret, num, msg) \
    {                              \
        if (ret == num)            \
        {                          \
            perror(msg);           \
            return -1;             \
        }                          \
    }



int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("usage: ./test_uart [device]\n");
        return -1;
    }
    int fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);
     ERROR_CHECK(fd, -1, "Unable to open device");
	// 恢复串口为阻塞状态
    fcntl(fd, F_SETFL, 0);
	// 设置串口不为终端设备
	isatty(STDIN_FILENO);
    //串口设置的结构体termios -- <termios.h>  
    struct termios options;  
    //2. 获取串口当前参数  
    tcgetattr(fd, &options);  
    //3. 修改参数<波特率、数据位、停止位、校验位、流控> 
	cfsetospeed(&options, B115200);			//波特率 -- 115200
	//cfsetospeed(&options, B9600);			//波特率 -- 9600
	options.c_cflag &= ~CSIZE;				//设置数据位之前，屏蔽其他位
	options.c_cflag |= CS8;					//数据位 -- 8
	options.c_cflag &= ~CSTOPB;				//停止位 -- 1位
	options.c_iflag &= ~PARENB;				//奇偶检验位 -- 无
	options.c_cflag &= ~CRTSCTS;			//流控 -- 无
	// 设置串口输入输出模式
	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
	options.c_oflag &= ~OPOST;   
    //设置属性生效时间， TCIFLUSH -- 不等数据传输完，立即生效（溢出数据可以接收，但不读）
    tcflush(fd, TCIFLUSH);	
	//4. 使设置的属性生效
    if (tcsetattr(fd, TCSANOW, &options) < 0) {
        perror("uart_setup: tcsetattr failed");
        return -1;
    }
    char buf[32] = "";
    ssize_t ret = read(fd,buf,sizeof(buf));
    ERROR_CHECK(ret,-1,"read");
     printf("%s\n",buf);
    
    // 设置时区
    setenv("TZ", "Asia/Shanghai", 1);
    tzset(); // 通知C库时区已更改
    // 获取当前时间
    time_t rawtime;
    time(&rawtime);
    struct tm *timeinfo = localtime(&rawtime);
    // 格式化时间字符串
    char time_str[32];
    snprintf(time_str, sizeof(time_str),
             "%04d%02d%02d%02d%02d%02d",
             timeinfo->tm_year + 1900,
             timeinfo->tm_mon + 1,
             timeinfo->tm_mday,
             timeinfo->tm_hour,
             timeinfo->tm_min,
             timeinfo->tm_sec);
    // 打印时间字符串
    printf("Formatted time: %s\n", time_str);
    // 发送时间字符串到串口
    ret = write(fd, time_str, strlen(time_str));
    ERROR_CHECK(ret, -1, "write failed");
 
    // 检查是否所有字节都被写入
    if (ret != (ssize_t)strlen(time_str)) {
        fprintf(stderr, "Warning: Not all bytes were written to the serial port.\n");
    }
    printf("Data sent successfully\n");

    while(1){
        read(fd,buf,sizeof(buf));
        printf("msg from usart:%s        \r",buf);
        memset(buf,'\0',sizeof(buf));
    };
    close(fd);
    return 0;
}
